home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1994-12-01 | 11.7 KB | 415 lines |
- Syntax10.Scn.Fnt
- Syntax10b.Scn.Fnt
- Syntax10i.Scn.Fnt
- FoldElems
- MODULE DisplayPat; (* V0.6 (C) 4 Nov 94 by Ralf Degner *)
- IMPORT
- Display, Files, Texts, TextFrames, Oberon, Fonts;
- CONST
- OriCol*=-1;
- TYPE
- PatData = POINTER TO PatDataDesc;
- PatDataDesc = RECORD
- Next: PatData;
- Data: POINTER TO ARRAY OF SET;
- END;
- OnePat = POINTER TO OnePatDesc;
- OnePatDesc = RECORD
- Color: INTEGER;
- Pat: Display.Pattern;
- Next: OnePat;
- END;
- Pattern = POINTER TO PatternDesc;
- PatternDesc = RECORD (OnePatDesc)
- W, H: INTEGER;
- END;
- (* the AMIGA needs the text in italic, because of if it is not there *)
- (* the garbage collectore kills the POINTERs in the open ARRAY *)
- (* ignore the warning, the compiler shows at the AMIGA (and Sun ?) *)
- AmigaTyp = POINTER TO AmigaTypDesc;
- AmigaTypDesc = RECORD
- Next: AmigaTyp;
- Pat: Pattern;
- END;
- Object*= POINTER TO ObjectDesc;
- ObjectDesc*= RECORD (PatDataDesc)
- FirstPatData: PatData;
- MaxPat: LONGINT;
- ColorMap*: ARRAY 256 OF INTEGER;
- Pats: POINTER TO ARRAY OF Pattern;
- ErrorMsg: BOOLEAN;
- Amiga: AmigaTyp;
- END;
- W: Texts.Writer;
- SetArray: ARRAY 8 OF SHORTINT;
- (* write SET in a portable way *)
- PROCEDURE WriteSet*(VAR R: Files.Rider; x: SET);
- VAR
- DumByte, DumBit, Count: INTEGER;
- Dummy: SHORTINT;
- BEGIN
- Count:=0;
- FOR DumByte:=0 TO 3 DO
- Dummy:=0;
- FOR DumBit:=0 TO 7 DO
- IF Count IN x THEN
- Dummy:=Dummy+SetArray[DumBit];
- END;
- INC(Count);
- END;
- Files.Write(R, Dummy);
- END;
- END WriteSet;
- (* read SET in a portable way *)
- PROCEDURE ReadSet*(VAR R: Files.Rider; VAR x: SET);
- VAR
- DumByte, DumBit, Count: INTEGER;
- Dummy: SHORTINT;
- BEGIN
- x:={};Count:=0;
- FOR DumByte:=0 TO 3 DO
- Files.Read(R, Dummy);
- FOR DumBit:=0 TO 7 DO
- IF (Dummy MOD 2)=1 THEN
- INCL(x, Count);
- END;
- Dummy:=Dummy DIV 2;
- INC(Count);
- END;
- END;
- END ReadSet;
- (* print errormessage, if ErrorMsg is TRUE *)
- PROCEDURE (o: Object) Print(Text: ARRAY OF CHAR);
- BEGIN
- IF o.ErrorMsg THEN
- Texts.WriteString(W, "DisplayPat error: ");
- Texts.WriteString(W, Text);
- Texts.WriteLn(W);
- Texts.Append(Oberon.Log, W.buf);
- END;
- END Print;
- (* install an object from diskfile *)
- PROCEDURE (o: Object) Install*(Name: ARRAY OF CHAR; Msg: BOOLEAN);
- VAR
- File: Files.File;
- Rider: Files.Rider;
- LDum, PatAnz, Counter: LONGINT;
- RealW, DPW, W, H, Color, LastColor, Dummy: INTEGER;
- LastOne, DumOne: OnePat;
- LastData, DumData: PatData;
- LastAmiga, DumAmiga: AmigaTyp;
- BEGIN
- o.ErrorMsg:=Msg;
- o.Pats:=NIL;
- o.FirstPatData:=NIL;
- o.MaxPat:=0;
- NEW(o.Amiga);
- o.Amiga.Next:=NIL;
- o.Amiga.Pat:=NIL;
- LastAmiga:=o.Amiga;
- File:=Files.Old(Name);
- IF File=NIL THEN
- o.Print("Can`t open Pat-File");
- RETURN;
- END;
- Files.Set(Rider, File, 0);
- Files.ReadLInt(Rider, LDum);
- IF LDum#26021970 THEN
- o.Print("File is not a Pat-File");
- RETURN;
- END;
- Files.ReadLInt(Rider, PatAnz);
- o.MaxPat:=PatAnz;
- NEW(o.Pats, PatAnz);
- Counter:=0;
- LastData:=o;
- WHILE PatAnz#Counter DO
- NEW(o.Pats[Counter]);
- Files.ReadInt(Rider, W);o.Pats[Counter].W:=W;
- Files.ReadInt(Rider, H);o.Pats[Counter].H:=H;
- LastOne:=o.Pats[Counter];
- NEW(DumAmiga);DumAmiga.Next:=NIL;
- LastAmiga.Next:=DumAmiga;
- DumAmiga.Pat:=o.Pats[Counter];
- LastAmiga:=DumAmiga;
- Files.ReadInt(Rider, Color);
- LastColor:=-1;
- WHILE Color#-1 DO
- IF Color#LastColor THEN
- DPW:=0;
- END;
- LastColor:=Color;
- NEW(DumOne);DumOne.Next:=NIL;
- NEW(DumData);DumData.Next:=NIL;
- NEW(DumData.Data, H+1);
- DumOne.Color:=Color;
- FOR Dummy:=1 TO H DO
- ReadSet(Rider, DumData.Data[Dummy]);
- END;
- RealW:=32;
- IF DPW+32>W THEN
- RealW:=W-DPW;
- END;
- DumOne.Pat:=Display.NewPattern(DumData.Data^, RealW, H);
- LastOne.Next:=DumOne;
- LastOne:=DumOne;
- LastData.Next:=DumData;
- LastData:=DumData;
- Files.ReadInt(Rider, Color);
- INC(DPW, 32);
- END;
- INC(Counter);
- END;
- FOR Dummy:=0 TO 255 DO
- o.ColorMap[Dummy]:=Dummy;
- END;
- Files.Close(File);
- END Install;
- (* get width and height of a pattern *)
- PROCEDURE (o: Object) GetPatternSize*(PatNr: LONGINT; VAR w, h: INTEGER);
- BEGIN
- IF (PatNr<0) OR (PatNr>=o.MaxPat) THEN
- o.Print("Unkown Pattern number");
- w:=0;h:=0;
- ELSE
- w:=o.Pats[PatNr].W;
- h:=o.Pats[PatNr].H;
- END;
- END GetPatternSize;
- (* get the Display.Pattern of a Pattern with number PatNr *)
- PROCEDURE (o: Object) GetPattern*(PatNr: INTEGER): Display.Pattern;
- VAR DumOnePat: OnePat;
- BEGIN
- IF (PatNr<0) OR (PatNr>=o.MaxPat) THEN
- o.Print("Unkown Pattern number");
- ELSE
- DumOnePat:=o.Pats[PatNr];
- IF DumOnePat.Next#NIL THEN
- IF DumOnePat.Next.Next=NIL THEN
- RETURN DumOnePat.Next.Pat;
- ELSE
- o.Print("Can`t get Pattern with more than 1 Color or width larger than 32");
- END;
- ELSE
- o.Print("Can`t get Pattern of empty one");
- END;
- END;
- RETURN 0;
- END GetPattern;
- PROCEDURE (o: Object) CopyPatternC*(f: Display.Frame; col: INTEGER; PatNr: LONGINT; X, Y, mode: INTEGER);
- VAR
- LastColor, Offset: INTEGER;
- PatInfo: OnePat;
- BEGIN
- IF (PatNr<0) OR (PatNr>=o.MaxPat) THEN
- o.Print("Unkown Pattern number");
- ELSE
- PatInfo:=o.Pats[PatNr];
- LastColor:=PatInfo.Next.Color;
- Offset:=-32;
- WHILE PatInfo.Next#NIL DO
- PatInfo:=PatInfo.Next;
- IF PatInfo.Color=LastColor THEN
- INC(Offset, 32);
- ELSE
- LastColor:=PatInfo.Color;
- IF mode=Display.replace THEN mode:=Display.paint;END;
- Offset:=0;
- END;
- IF col=OriCol THEN
- Display.CopyPatternC(f, o.ColorMap[PatInfo.Color], PatInfo.Pat, X+Offset, Y, mode);
- ELSE
- Display.CopyPatternC(f, col, PatInfo.Pat, X+Offset, Y, mode);
- END;
- END;
- END;
- END CopyPatternC;
- PROCEDURE (o: Object) CopyPattern*(col: INTEGER; PatNr: LONGINT; X, Y, mode: INTEGER);
- VAR
- LastColor, Offset: INTEGER;
- PatInfo: OnePat;
- BEGIN
- IF (PatNr<0) OR (PatNr>=o.MaxPat) THEN
- o.Print("Unkown Pattern number");
- RETURN
- END;
- PatInfo:=o.Pats[PatNr];
- LastColor:=PatInfo.Next.Color;
- Offset:=-32;
- WHILE PatInfo.Next#NIL DO
- PatInfo:=PatInfo.Next;
- IF PatInfo.Color=LastColor THEN
- INC(Offset, 32);
- ELSE
- LastColor:=PatInfo.Color;
- IF mode=Display.replace THEN mode:=Display.paint;END;
- Offset:=0;
- END;
- IF col=OriCol THEN
- Display.CopyPattern(o.ColorMap[PatInfo.Color], PatInfo.Pat, X+Offset, Y, mode);
- ELSE
- Display.CopyPattern(col, PatInfo.Pat, X+Offset, Y, mode);
- END;
- END;
- END CopyPattern;
- PROCEDURE (o: Object) ReplPatternC*(f: Display.Frame; col: INTEGER; PatNr: LONGINT; X, Y, W, H, X0, Y0, mode: INTEGER);
- VAR
- LastColor, Offset: INTEGER;
- PatInfo: OnePat;
- BEGIN
- IF (PatNr<0) OR (PatNr>=o.MaxPat) THEN
- o.Print("Unkown Pattern number");
- RETURN
- END;
- PatInfo:=o.Pats[PatNr];
- IF o.Pats[PatNr].W<33 THEN
- LastColor:=PatInfo.Next.Color;
- Offset:=-32;
- WHILE PatInfo.Next#NIL DO
- PatInfo:=PatInfo.Next;
- IF PatInfo.Color=LastColor THEN
- INC(Offset, 32);
- ELSE
- LastColor:=PatInfo.Color;
- IF mode=Display.replace THEN mode:=Display.paint;END;
- Offset:=0;
- END;
- IF col=OriCol THEN
- Display.ReplPatternC(f, o.ColorMap[PatInfo.Color], PatInfo.Pat, X+Offset, Y, W, H, X0, Y0, mode);
- ELSE
- Display.ReplPatternC(f, col, PatInfo.Pat, X+Offset, Y, W, H, X0, Y0, mode);
- END;
- END;
- ELSE
- o.Print("ReplPatternC can display only pattern with width <=32");
- o.Print("use ReplPatternN instead");
- END;
- END ReplPatternC;
- PROCEDURE (o: Object) ReplPattern*(col: INTEGER; PatNr: LONGINT; X, Y, W, H, mode: INTEGER);
- VAR
- LastColor, Offset: INTEGER;
- PatInfo: OnePat;
- BEGIN
- IF (PatNr<0) OR (PatNr>=o.MaxPat) THEN
- o.Print("Unkown Pattern number");
- RETURN
- END;
- PatInfo:=o.Pats[PatNr];
- IF o.Pats[PatNr].W<33 THEN
- LastColor:=PatInfo.Next.Color;
- Offset:=-32;
- WHILE PatInfo.Next#NIL DO
- PatInfo:=PatInfo.Next;
- IF PatInfo.Color=LastColor THEN
- INC(Offset, 32);
- ELSE
- LastColor:=PatInfo.Color;
- IF mode=Display.replace THEN mode:=Display.paint;END;
- Offset:=0;
- END;
- IF col=OriCol THEN
- Display.ReplPattern(o.ColorMap[PatInfo.Color], PatInfo.Pat, X+Offset, Y, W, H, mode);
- ELSE
- Display.ReplPattern(col, PatInfo.Pat, X+Offset, Y, W, H, mode);
- END;
- END;
- ELSE
- o.Print("ReplPattern can display only pattern with width <=32");
- o.Print("use ReplPatternN instead");
- END;
- END ReplPattern;
- PROCEDURE (o: Object) ReplPatternN*(f: Display.Frame; col: INTEGER; PatNr: LONGINT; X, Y, W, H, X0, Y0, mode: INTEGER);
- VAR
- g: Display.Frame;
- DumX, DumY: INTEGER;
- PatW, PatH: INTEGER;
- BEGIN
- IF (PatNr<0) OR (PatNr>=o.MaxPat) THEN
- o.Print("Unkown Pattern number");
- RETURN
- END;
- o.GetPatternSize(PatNr, PatW, PatH);
- IF (PatW=0) OR (PatH=0) THEN RETURN;END;
- NEW(g);
- IF X<f.X THEN (* X in Frame ? *)
- W:=W-f.X+X;
- X0:=X0+f.X-X;
- X:=f.X;
- END;
- IF Y<f.Y THEN (* Y in Frame ? *)
- H:=H-f.Y+Y;
- Y0:=Y0+f.Y-Y;
- Y:=f.Y;
- END;
- IF X+W>f.X+f.W THEN (* X+W in Frame ? *)
- W:=f.X+f.W-X;
- END;
- IF Y+H>f.Y+f.H THEN (* Y+H in Frame ? *)
- H:=f.Y+f.H-Y;
- END;
- X0:=X0-X MOD PatW;
- Y0:=Y0-Y MOD PatH;
- g.X:=X;g.Y:=Y;g.W:=W;g.H:=H;
- X0:=X0 MOD PatW;Y0:=Y0 MOD PatH;
- IF X0#0 THEN
- X0:=PatW-X0;X:=X-X0;W:=W+X0;
- END;
- IF Y0#0 THEN
- Y0:=PatH-Y0;Y:=Y-Y0;H:=H+Y0;
- END;
- FOR DumX:=0 TO (W DIV PatW) DO
- FOR DumY:=0 TO (H DIV PatH) DO
- o.CopyPatternC(g, col, PatNr, X+DumX*PatW, Y+DumY*PatH, mode);
- END;
- END;
- END ReplPatternN;
- PROCEDURE TextLength*(Font: Fonts.Font; Buffer: Texts.Buffer): INTEGER;
- VAR
- Text: Texts.Text;
- DB: Texts.Buffer;
- Reader: Texts.Reader;
- Counter: INTEGER;
- Zeichen: CHAR;
- p: Display.Pattern;
- dx, x, y, w, h: INTEGER;
- BEGIN
- Counter:=0;
- NEW(DB);
- Texts.OpenBuf(DB);
- Texts.Copy(Buffer, DB);
- Text:=TextFrames.Text("");
- Texts.Append(Text, DB);
- Texts.OpenReader(Reader, Text, 0);
- Texts.Read(Reader, Zeichen);
- WHILE (Zeichen#0DX) & (~Reader.eot) DO
- Display.GetChar(Font.raster, Zeichen, dx, x, y, w, h, p);
- INC(Counter, dx);
- Texts.Read(Reader, Zeichen);
- END;
- RETURN Counter;
- END TextLength;
- PROCEDURE PlotText*(f: Display.Frame; col: INTEGER; F: Fonts.Font; B: Texts.Buffer; XPos, YPos, mode: INTEGER);
- VAR
- Text: Texts.Text;
- Reader: Texts.Reader;
- Zeichen: CHAR;
- p: Display.Pattern;
- dx, x, y, w, h: INTEGER;
- BEGIN
- Text:=TextFrames.Text("");
- Texts.Append(Text, B);
- Texts.OpenReader(Reader, Text, 0);
- Texts.Read(Reader, Zeichen);
- WHILE (Zeichen#0DX) & (~Reader.eot) DO
- Display.GetChar(F.raster, Zeichen, dx, x, y, w, h, p);
- Display.CopyPatternC(f, col, p, XPos+x, YPos+y, mode);
- INC(XPos, dx);
- Texts.Read(Reader, Zeichen);
- END;
- END PlotText;
- BEGIN
- SetArray[0]:=1;SetArray[1]:=2;SetArray[2]:=4;SetArray[3]:=8;
- SetArray[4]:=16;SetArray[5]:=32;SetArray[6]:=64;SetArray[7]:=-128;
- Texts.OpenWriter(W);
- END DisplayPat.
-